package com.example.redistest.service;

import com.example.redistest.domain.tbUser;
import com.example.redistest.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
@CacheConfig(cacheNames = "user") //抽取缓存的公共位置
public class UserService {
    @Autowired
    private UserMapper userMapper;

    //将方法的运行结果进入缓存,这样以后再相同的数据直接从缓存中取,不用再调用方法(减少了数据库的交互,提高了效率)
    //属性介绍:
    // cacheNames/value:缓存组件的名称:用来存放该方法返回值的地方,用数组的方式来存储,可以指定多个缓存
    //key:缓存数据用来指定的key,默认key使用方法的参数,或者使用keyGenerator(这个使用在config类中配置),就是key生成器,二选一即可
    //CacheManager:指定从哪个缓存管理器取 或者CacheResolver缓存解析器,两者功能一样
    //Condition:指定符合条件下,才会进行缓存,condition="#id">0 的情况下才会缓存
    //unless:否定缓存,当unless指定的条件时true是就不缓存,可以回去结果进行判断 #result==null;
    //sync:是否使用异步模式
    @Cacheable(key = "#root.methodName+'['+#id+']'")
    public tbUser getUserById(int id) {
        System.out.println("查询了" + id + "号用户");
        return userMapper.getUserById(id);

    }

    public int addUser(tbUser user) {
        return userMapper.addUser(user);
    }

    /**
     * @CachePut 该注解表示及调用方法, 又更新数据库缓存  同步更新缓存
     * 修改某个数据更新缓存
     * 运行时机:
     * 先调用目标方法,然后把方法的结果缓存起来
     * key  要和查询的key保持一致
     */

    @CachePut(key = "#root.methodName+'['+#id+']'")
    public int updateUser(tbUser user) {
        return userMapper.updateUser(user);
    }

    /***
     *@CacheEvict 清除缓存
     * allEntries = true 清除所有缓存
     * beforeInvocation 是否在方法之前执行,默认是false
     */
    @CacheEvict(key = "#root.methodName+'['+#id+']'")
    public int deleteUser(int id) {
        return userMapper.deleteUser(id);
    }
}
